import { app, BrowserWindow, dialog, ipcMain } from 'electron'
import { fileURLToPath } from 'node:url'
import path from 'node:path'
import fs from 'node:fs' 
import { analyzeExcel, mergeExcel } from './excel'
import { FileStatus } from '@/types';


const __dirname = path.dirname(fileURLToPath(import.meta.url))

process.env.APP_ROOT = path.join(__dirname, '..')

// 🚧 Use ['ENV_NAME'] avoid vite:define plugin - Vite@2.x
export const VITE_DEV_SERVER_URL = process.env['VITE_DEV_SERVER_URL']
export const MAIN_DIST = path.join(process.env.APP_ROOT, 'dist-electron')
export const RENDERER_DIST = path.join(process.env.APP_ROOT, 'dist')

process.env.VITE_PUBLIC = VITE_DEV_SERVER_URL ? path.join(process.env.APP_ROOT, 'public') : RENDERER_DIST

let win: BrowserWindow | null

function createWindow() {
  win = new BrowserWindow({
    width: 1200,
    height: 800,
    autoHideMenuBar: true,
    title: 'TZTool',
    resizable: false,
    icon: path.join(process.env.VITE_PUBLIC, 'tztool.svg'),
    webPreferences: {
      preload: path.join(__dirname, 'preload.mjs'),
      nodeIntegration: true,
    },
  })

  // Test active push message to Renderer-process.
  win.webContents.on('did-finish-load', () => {
    win?.webContents.send('main-process-message', (new Date).toLocaleString())
  })

  if (VITE_DEV_SERVER_URL) {
    win.loadURL(VITE_DEV_SERVER_URL)
  } else {
    // win.loadFile('dist/index.html')
    win.loadFile(path.join(RENDERER_DIST, 'index.html'))
  }
}

// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
    win = null
  }
})

app.on('activate', () => {
  // On OS X it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow()
  }
})

app.whenReady().then(createWindow)

// 在 app.whenReady() 回调中添加：
ipcMain.handle('dialog:openDirectory', async () => {
  const result = await dialog.showOpenDialog({
    properties: ['openDirectory']
  });

  if (!result.canceled) {
    const folderPath = result.filePaths[0];
    const files = await fs.promises.readdir(folderPath);
    // 排除隐藏文件和临时文件
    const filteredFiles = files.filter(file => {
      return !file.startsWith('.') && !file.endsWith('~') && !file.startsWith('~$')
    });
    // 筛选出 Excel 文件
    const excelFiles = filteredFiles.filter(file => {
      const ext = path.extname(file).toLowerCase();
      return ext === '.xlsx' || ext === '.xls';
    });

    return {
      ...result,
      excelCount: excelFiles.length,
      excelFiles: excelFiles
    };
  }
  return result;
});

// 处理 Excel 分析请求
ipcMain.handle('excel:analyze', async (_, filePath: string) => {
  return analyzeExcel(filePath);
});

// 处理 Excel 合并请求
ipcMain.handle('excel:merge', async (event, path: string, files: FileStatus[]) => {
  try {
    // 确保使用一致的事件名称 'excel:merge-progress'
    return await mergeExcel(path, files, event.sender);
  } catch (error) {
    return {
      success: false,
      error: (error as Error).message
    };
  }
});
// 获取应用版本号
ipcMain.handle('app:getVersion', () => {
  return app.getVersion();
});
